package _go

/*400. 第 N 位数字
给你一个整数 n ，请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位数字。



示例 1：

输入：n = 3
输出：3
示例 2：

输入：n = 11
输出：0
解释：第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ，它是 10 的一部分。


提示：

1 <= n <= 231 - 1*/

//这是个数学题
func findNthDigit(n int) int {
	digits := 1
	flag := 9
	// 求n所在的数为几位数
	for n-flag*digits > 0 {
		n = n - flag*digits
		flag = flag * 10
		digits++
	}
	fmt.Printf(" n %d di %d", n, digits)
	//计算完所在区域 同时也计算出来了 n是在该区域的那个数

	// 若n为个位数，返回n即可
	if digits == 1 {
		return n
	}
	number := 1
	for k := 1; k < digits; k++ {
		number = number * 10
	}
	// 求n对应的数  n-1 是因为从0开始的    n表示的是第几位
	// n -1 / digits 表示在这个区域内的第几个数字 n=199 时  number: 103 =  100 + (10-1)/ 3
	number = number + (n-1)/digits
	// idx 标识103 这个数的第几位   10-9 % 3  = 0 即为第0位
	idx := (n - 1) % digits
	// 将n对应的数转换为字符串类型，取第idx位并转换为整数
	strnums := strconv.Itoa(number)
	res, _ := strconv.Atoi(string(strnums[idx]))
	return res
}
